/*
 * funcionesNodos.c
 *
 *  Created on: 02/11/2011
 *      Author: utn_so
 */

#include "raid.h"

void nodoEscritura_crear(struct estructuraEscribir **punteroEstructura,int32_t sector,char infoSector[512])
{
	*punteroEstructura=calloc(1,sizeof(struct estructuraEscribir));
	(*punteroEstructura)->numeroSector=sector;
	memcpy((*punteroEstructura)->infoSector,infoSector,512);
	(*punteroEstructura)->siguiente=NULL;
}

void nodoLectura_crear(struct estructuraLeer **punteroEstructura,int32_t sector, int32_t esSincro)
{
	*punteroEstructura=calloc(1,sizeof(struct estructuraLeer));
	(*punteroEstructura)->numeroSector=sector;
	(*punteroEstructura)->sincro=esSincro;
	(*punteroEstructura)->siguiente=NULL;
}

void colaEscritura_meter(struct estructuraEscribir **punteroFte,struct estructuraEscribir **punteroFin, struct estructuraEscribir **punteroEstructura)
{
	pthread_mutex_lock(&mutexPtroFteEscritura);

	if(*punteroFte==NULL)
		{
		pthread_mutex_lock(&mutexPtroFte);
			*punteroFte=*punteroEstructura;
		pthread_mutex_unlock(&mutexPtroFte);
		}

	else
		{
		pthread_mutex_lock(&mutexPtroFteEsc);
			(*punteroFin)->siguiente=*punteroEstructura;
		pthread_mutex_unlock(&mutexPtroFteEsc);
		}
	pthread_mutex_lock(&mutexPtroFinEsc);
	*punteroFin=*punteroEstructura;
	pthread_mutex_unlock(&mutexPtroFinEsc);

	pthread_mutex_unlock(&mutexPtroFteEscritura);
}

void colaLectura_meter(struct estructuraLeer **punteroFte,struct estructuraLeer **punteroFin, struct estructuraLeer **punteroEstructura)
{
	if(*punteroFte==NULL)
		{
			*punteroFte=*punteroEstructura;
		}
	else
		{
			(*punteroFin)->siguiente=*punteroEstructura;
		}
	*punteroFin=*punteroEstructura;
}




void colaEscritura_liberar(struct estructuraEscribir **punteroFrente,struct estructuraEscribir **punteroFin)
{
	struct estructuraEscribir *punteroListaAuxiliar;
	while (*punteroFin!=NULL)
		{
		punteroListaAuxiliar=*punteroFrente;
		(*punteroFrente)=(*punteroFrente)->siguiente;
		printf("%d\n",punteroListaAuxiliar->numeroSector);
		if(*punteroFrente==NULL)
			{
			*punteroFin=NULL;
			}
		free(punteroListaAuxiliar);
		punteroListaAuxiliar=NULL;
		}
}
void nodoDeColaBackup_eliminar(struct estructuraLeer **punteroBackup,struct estructuraLeer **punteroBackupFin,int32_t sector) {

	estructuraLeer *auxiliar;
	estructuraLeer *anterior;
	auxiliar = *punteroBackup;
	while(auxiliar && (auxiliar->numeroSector != sector)) {
		anterior = auxiliar;
		auxiliar = auxiliar->siguiente;
	}
	if ((auxiliar!=NULL)&&(*punteroBackup == auxiliar)){
		*punteroBackup = (*punteroBackup)->siguiente;

	}else{

		anterior->siguiente = auxiliar->siguiente;

	}
	if(auxiliar==*punteroBackupFin){
				*punteroBackupFin=anterior;
			}
	free(auxiliar);

	return;
}

void colaLectura_liberar(struct estructuraLeer **punteroFrente,struct estructuraLeer **punteroFin)
{
	struct estructuraLeer *punteroListaAuxiliar;
	while (*punteroFin!=NULL)
		{
		punteroListaAuxiliar=*punteroFrente;
		(*punteroFrente)=(*punteroFrente)->siguiente;
		printf("%d\n",punteroListaAuxiliar->numeroSector);
		if(*punteroFrente==NULL)
			{
			*punteroFin=NULL;
			}
		free(punteroListaAuxiliar);
		punteroListaAuxiliar=NULL;
		}
}



void nodoColaEscritura_liberar(struct estructuraEscribir **punteroFrente,struct estructuraEscribir **punteroFin)
{
	struct estructuraEscribir *punteroListaAuxiliar;

		punteroListaAuxiliar=*punteroFrente;

		(*punteroFrente)=(*punteroFrente)->siguiente;


		pthread_mutex_lock(&mutexPtroFinEsc);
		if(*punteroFrente==NULL)
			{

			*punteroFin=NULL;
			}
		pthread_mutex_unlock(&mutexPtroFinEsc);
		free(punteroListaAuxiliar);
		punteroListaAuxiliar=NULL;

}

void nodoColaLectura_liberar(struct estructuraLeer **punteroFrente,struct estructuraLeer **punteroFin)
{
	struct estructuraLeer *punteroListaAuxiliar;

		punteroListaAuxiliar=*punteroFrente;
		(*punteroFrente)=(*punteroFrente)->siguiente;

		if(*punteroFrente==NULL)
			{
			*punteroFin=NULL;
			}
		free(punteroListaAuxiliar);
		punteroListaAuxiliar=NULL;

}
